ホームに戻る
出典 :
フォームにOKボタン、キャンセルボタンを付ける - .NET Tips (VB.NET,C#...)
目次 :

アプリケーションからフォームを開く

Form.Show() または Form.ShowDialog() でフォームを開くことができる。
その際、いずれを用いるかでタスクの挙動が異なる。
開く際のメソッド フォームの形態
Form.Show() モードレス(非同期) 別タスクとして開くため、元アプリケーションの処理が継続される
Form.ShowDialog() モーダル(同期) フォームを閉じるまでの間、元アプリケーションの処理が中断される

サンプルコード : モードレス

元アプリケーションと開かれたフォームの両タスクは並行する。
即ち、Form.Show() をコールした直後、後続行がすぐに実行される。
// フォームインスタンス生成 Form_Sub form_Sub = new Form_Sub(); // form_Sub をモードレスダイアログとして開く form_Sub.Show(); // form_Sub を開いた直後に、後続行が実行される // (form_Sub を閉じたかは問われない) Hoge(); Fuga(); :

サンプルコード : モーダル

フォームは元アプリケーションのタスク内で実行される。
即ち、Form.ShowDialog() をコール後、フォームを閉じるまで後続行は実行されない。
( Form.ShowDialog() はフォームを閉じるまで完了しない。)
// フォームインスタンス生成 Form_Sub form_Sub = new Form_Sub(); // form_Sub をモーダルダイアログとして開く form_Sub.ShowDialog(); // form_Sub を閉じるまで後続行は実行されない Hoge(); Fuga(); :

フォームの処理結果(DialogResult)

フォームの処理結果を DialogResult プロパティ( DialogResult 型)から参照することができる。

DialogResult の確定

public partial class Form_Sub : Form { // - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - // コンストラクタ // - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - public Form_Sub() { InitializeComponent(); } // - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - // ボタン「はい」クリック時の処理 // - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - private void button_Yes_Click(object sender, EventArgs e) { // プロパティ DialogResult を更新 ⇒ フォームが閉じる DialogResult = DialogResult.Yes; } // - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - // ボタン「いいえ」クリック時の処理 // - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - private void button_No_Click(object sender, EventArgs e) { // プロパティ DialogResult を更新 ⇒ フォームが閉じる DialogResult = DialogResult.No; } }
DialogResult プロパティの初期値は DialogResult.None 。
フォームがモーダルの場合、DialogResult プロパティの値を更新すると自動的にフォームが閉じられるため、
Close() を明示的にコールする必要は無い。

DialogResult を元アプリケーションから参照

// フォームインスタンス生成 Form_Sub form_Sub = new Form_Sub(); // form_Sub をモーダルダイアログとして開く form_Sub.ShowDialog(); // form_Sub の実行結果(DialogResult)を参照 if (form_Sub.DialogResult == DialogResult.No) { return; } :
フォームインスタンスを再利用しないのであれば、以下のように簡略化可能。
( ShowDialog() は DialogResult プロパティを戻り値として返す。)
// Form_Sub を開いて実行結果(DialogResult)を取得 if (new Form_Sub().ShowDialog() == DialogResult.No) { return; } :
フォームの実行結果を参照する場合、通常はフォームをモーダルで開く( ShowDialog() )
上記のコードでは Form_Sub を閉じるまで後続の処理( if 文以降)が行われないため、単純な処理で DialogResult を確定させてから判定することができる。

フォームをモーダルで開い( Show() )た場合、DialogResult は戻り値としては得られない。
モードレスダイアログの DialogResult を参照するには、元アプリからのポーリングや、
フォームからイベントを発行する(フォームが閉じられたことを通知する)などの機構を用意する必要がある。詳細は割愛。

DialogResult 型の取りうる値(一例)

DialogResult.None結果が設定されていない状態(デフォルト)
DialogResult.Cancel主に「キャンセル」ボタン押下時
DialogResult.OK主に「OK」ボタン押下時
DialogResult.Yes主に「はい」ボタン押下時
DialogResult.No主に「いいえ」ボタン押下時